
#ifndef __P_API_H
#define __P_API_H

#ifdef _WIN32 
#include <windef.h>
#endif
#include <sys/types.h>

//typedef unsigned long		DWORD;
//typedef unsigned short	WORD;
//typedef unsigned char     BYTE;

// Default connect parameters
// -----------------------------------
#define P_DEFAULT_SERVER_HOST       "127.0.0.1"
#define P_DEFAULT_SERVER_PORT       3107

// Protocol ID's
// -----------------------------------
#define PROTOCOL_OSCAR				0	// ICQ
#define PROTOCOL_XMPP 				1	// Jabber
#define PROTOCOL_MRIM				2	// Mail.ru Agent
#define PROTOCOL_VK					3	// Vkontakte.ru

#define PROTOCOL_VER				0x0A	// 1.0

// Status values (used to set own status)
// -----------------------------------
#define P_STATUS_OFFLINE				0x00 // Supported in ICQ, XMPP, MRIM, VK
#define P_STATUS_ONLINE					0x01 // Supported in ICQ, XMPP, MRIM, VK
#define P_STATUS_FFC					0x02 // Supported in ICQ, XMPP, MRIM,
#define P_STATUS_AWAY					0x03 // Supported in ICQ, XMPP,
#define P_STATUS_DND					0x04 // Supported in ICQ, XMPP,
#define P_STATUS_NA						0x05 // Supported in ICQ, XMPP,
#define P_STATUS_INVISIBLE				0x06 // Supported in ICQ, XMPP, MRIM,

#define P_STATUS_ALL_CAN_SEE			0x10 // Supported in ICQ	// Видимый для всех
#define P_STATUS_VISLIST_CAN_SEE		0x20 // Supported in ICQ	// Видимый только для списка видящих
#define P_STATUS_INVISLIST_CANNOT_SEE	0x30 // Supported in ICQ	// Видимый для всех, кроме списка невидящих
#define P_STATUS_CONTACTLIST_CAN_SEE	0x40 // Supported in ICQ	// Видимый только для списка контактов
#define P_STATUS_NOBODY_CAN_SEE			0x50 // Supported in ICQ	// Невидимый для всех

// Коды ошибок для P_ERROR
// -----------------------------------
#define ERROR_BAD_PACKET			0x01 // Кривой пакет
#define ERROR_INVALID_PROTOCOL		0x10 // Не правильный индефикатор протокола, или он не потдерживается 
#define ERROR_INVALID_PROTOCOL_VER	0x11 // Версия протокола клиента не потдерживается сервером
#define ERROR_USER_KICKED			0x12 // 
#define	ERROR_REMOVED_SERVER		0x20 // Ошибка удаленного сервера (ICQ, XMPP или MRIM)
#define	ERROR_DOUBLE_LOGIN			0x21 // Двойной вход с учетной записи, Only ICQ, MRIM.
#define	ERROR_RATE_LIMIT_EXCEEDED	0x22 // Превышен лимит переподключений
#define ERROR_BAD_LOGIN_PW			0x30 // Неправильный логин или пароль

// Коды серверных сообщений
// -----------------------------------
#define SRV_MSG_YOU_WERE_ADDED		0x01 // Вас добавили
#define SRV_MSG_AUTH_RESPONSE		0x02 //	if ( PACKET_T::data[1] == 0 ) 
										 //		Запрос авторизации отклонили
										 //	else if ( PACKET_T::data[1] == 1 ) 
										 //		Вас авторизовали


// Константы операций (взаимодействие с сервером шлюза)
// -----------------------------------
#define P_SERVER_STATISTICS			0x01	// C > S or S > C	// Запрос или ответ на запрос статистики сервера, не требует авторизации

#define P_ERROR 					0x10	// S > C			// В (BYTE)PACKET_T::data код ошибки, 1 байт.
#define P_PING						0x11	// C > S

// Порядок авторизации на сервере
#define P_LOGIN_HELLO 				0x20	// C > S			// Пакет приветствия, empty
#define P_LOGIN_HELLO_ACK 			0x21	// S > C			// Сервер работает, шлем ему P_LOGIN
#define P_LOGIN 					0x22	// C > S			// Авторизация на сервере, отправляем серверу PACKET_LOGIN_PARAMS_T
#define P_LOGIN_OK 					0x23	// S > C			// Авторизация прошла успешна, empty
#define P_LOGOUT					0x24	// C > S			// Дисконнект, empty
// Сообщения
#define P_MESSAGE					0x30	// C > S or S > C	// Исходящее или входящее сообщение, 
#define P_MSG_SEND_URL				0x31	// C > S or S > C	// Отправить ссылку

#define P_MSG_DELIVERY_SRV			0x32	// S > C			// Сервер получил сообщение (отчет о доставкке)
																// 
#define P_MSG_DELIVERY_CLI			0x33	// C > S or S > C	// Клиент получил сообщение

// Оповещение о наборе
#define P_TYPING_NTF_START 			0x40	// C > S or S > C 	// Исходящее или входящее оповещение о начале наборе текста
#define P_TYPING_NTF_DONE 			0x41	// C > S or S > C	// Исходящее или входящее оповещение о конце набора текста
// Статусы
#define P_STATUS_CHECK 				0x50	// C > S 			// Проверить статус пользователя
#define P_STATUS_CHANGE 			0x51	// C > S or S > C	// Пользователь сменил статус
#define P_XSTATUS_CHANGE 			0x52	// C > S or S > C	// Пользователь сменил x-статус
#define P_XTEXT_REQ 				0x53	// C > S or S > C 	// Я или у меня запрашивают x-статус
#define P_XTEXT_REQ_ANSWER	 		0x54	// C > S			// Ответ на запрос x-статуса
// Управравление подпиской
#define P_AUTH_REQ 					0x60	// C > S or S > C	// Отправлен или пришел запрос на авторизацию
																// 		В PACKET_T::data текст запроса
#define P_AUTH_SET 					0x61	// C > S			// Ответить на запрос на авторизации
																// 		PACKET_T::data = 0x01 - принять
																// 		PACKET_T::data = 0x00 - отклонить
// Контакт лист
#define P_ROSTER 					0x70	// C > S or S > C	// Запрос контакт листа или ответ на него
// Vcard
#define P_USER_INFO		 			0x80	// C > S or S > C	// Отправлен или пришел запрос информации о контакте
#define P_USER_INFO_SET 			0x81	// C > S			// Установить информацию о контакте
// Информация о клиенте
#define P_VERSION	 				0x90	// C > S or S > C	// Запросить информацию о клиенте или ответ на запрос
																// Если PACKET_T::dlen = 1, то пришел только id клиента
// Управление контакт листом
#define P_CONTACT_ADD 				0xA0	// C > S			// Добавить контакт.
																// 		В PACKET_T::data должно быть название группы
#define P_CONTACT_REMOVE 			0xA1	// C > S			// Удалить контакт
#define P_CONTACT_MOVE 				0xA2	// C > S			// Переместить контакт
																// 		В PACKET_T::data должно быть название группы		
#define P_CONTACT_RENAME 			0xA3	// C > S			// Переименовать контакт
																// 		В PACKET_T::data должен быть новый ник				
#define P_CONTACT_REMOVED 			0xA4	// S > C			// Контакт удалился из моего контакт листа
// Управление группами
#define P_GROUP_ADD 				0xA5	// C > S			// Добавить группу
#define P_GROUP_RENAME 				0xA6	// C > S			// Переименовать группу
																// PACKET_T::data Исходное имя группы и новое имя группы
#define P_GROUP_REMOVE 				0xA7	// C > S			// Удалить группу

#define P_SERVER_MESSAGE			0xB0	// S > C			// Серверные сообщения

// Загаловок пакета
typedef struct
{
	DWORD      		magic;			// Magic
	BYTE 			type;			// Тип пакета
//	BYTE 			subtype;		// Подтип пакета
	char 			login[32];		// Кому или от кого, UIN, JID or Email
	DWORD      		seq;			// 
	DWORD			dlen;			// Размер данных
	BYTE			reserved[16];	// Зарезервиравано
} PACKET_HEADER_T;

#define P_MAGIC    0x01DA1EF9		// Клиентский Magic ( C <-> S )
 
// C > S
// @P_LOGIN
// Параметры для входа
//PACKET_LOGIN_PARAMS_T
//BYTE 				protocol_id;	// ID протокола
//BYTE				protocol_ver;	// Версия протокола
//string   			login;		// UIN, JID or Email
//string    		pass;		// Пароль, в будущем хэш.
//string   			host;		// Хост, если равен нулю, то сервер подключается к хосту по умолчанию  
//BYTE          	status;			
//string            status_msg;
//BYTE          	xstatus;
//string            xstatus_msg;
//BYTE          	client_id;			// Индефикатор клиента
//string            client_name;	// Название
//string            client_ver;		// Версия
//string            client_build;	// Билд
//string            client_os;		// Операционная система


// S > C
// @P_SERVER_STATISTICS
// Статистика сервера
//string            start_time;		// Время запуска сервера
//string            version;		// Версия сервера
//string            os;				// Операнионная ситема на котором запущен сервер
//string            online_clients;	// Количество подключенных к серверу клиентов

// C > S or S > C
// @P_MESSAGE
// Сообщения 
// WORD 		id сообщения
// string		text;

// C > S or S > C
// @P_MSG_DELIVERY_SRV
// @P_MSG_DELIVERY_CLI
// Отчеты о доставке
// WORD 		id сообщения

// C > S or S > C
// @P_STATUS_CHANGE
// Статусы
//BYTE			id;				// ID статуса
//string		text;			// Статусное сообщение


// S > C
// @P_VERSION
// Индефикаторы Jabber клиентов
enum
{
	CLIENT_XMPP_N_A = 0,
	CLIENT_XMPP_JIMM_ASPRO,
	CLIENT_XMPP_BOMBUS_PLUS,
	CLIENT_XMPP_BOMBUSMOD,
	CLIENT_XMPP_BOMBUS_NG,
	CLIENT_XMPP_BOMBUS,
	CLIENT_XMPP_BAYANICQ,
	CLIENT_XMPP_MAIL_AGENT,
	CLIENT_XMPP_TALKONAUT,
	CLIENT_XMPP_NIMBUZZ,
	CLIENT_XMPP_MCHAT,
	CLIENT_XMPP_QIP,
	CLIENT_XMPP_GOOGLE_TALK,
	CLIENT_XMPP_YA_ONLINE,
	CLIENT_XMPP_MIRANDA,
	CLIENT_XMPP_PSI,
	CLIENT_XMPP_PSI_PLUS,
	CLIENT_XMPP_QUTIM,
	CLIENT_XMPP_TKABBER,
	CLIENT_XMPP_GAJIM,
	CLIENT_XMPP_PIDGIN,
	CLIENT_XMPP_KOPETE,
	CLIENT_XMPP_JAJC,
	CLIENT_XMPP_ICHATAGENT,
	CLIENT_XMPP_JABBIM,
	CLIENT_XMPP_PYICQ_T,		// ICQ-транспорт
	CLIENT_XMPP_MRIM_TRANSPORT,	// MRIM-транспорт
	CLIENT_XMPP_VKONTAKTE,		// Vkontakte-транспорт
	CLIENT_XMPP_MJABBER,
	CLIENT_XMPP_MAX
};

// S > C
// @P_VERSION
// Информация о клиенте
//BYTE 				id;			// ID клиента
//string			name;		// Название
//string 			version;	// Версия
//string            build;
//string 			os;			// Опереционная система
//string			phone_model;// Модель телефона

// S > C
// @P_USER_INFO
// Информация о контакте

// Статус подписки
enum {
	P_SUB_NONE = 0,
	P_SUB_TO,
	P_SUB_FROM,
	P_SUB_BOTH
};

// S > C
// Контакт лист приходит на запрос P_ROSTER.
// В PACKET_T::data содержитмя массив из элементов с типом PACKET_CONTACT_T и
// количесвом PACKET_T::dlen/sizeof(PACKET_CONTACT_T)

//string			login;		 // UIN, JID, Email or VkID
//string			nick;		 // Псевдоним
//string 			group;		 // Группа контакта
//BYTE				subscription;// Статус подписки/авторизации

// S > C
// @P_SERVER_MESSAGE
// Сервереые сообщения
// BYTE				msg_id;
// BYTE				submsg_id;


#endif	 // __P_API_H
